package com.qf.zyh.services.Impl;

import com.qf.zyh.common.Const;
import com.qf.zyh.dao.CartDao;
import com.qf.zyh.dao.Impl.CartDaoImpl;
import com.qf.zyh.dao.Impl.ItemDaoImpl;
import com.qf.zyh.dao.Impl.OrderDaoImpl;
import com.qf.zyh.dao.ItemDao;
import com.qf.zyh.dao.OrderDao;
import com.qf.zyh.entity.Cart;
import com.qf.zyh.entity.Item;
import com.qf.zyh.entity.Orders;
import com.qf.zyh.services.OrderSer;
import com.qf.zyh.util.DBUtil;
import com.qf.zyh.util.RandomUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class OrderSerImpl implements OrderSer {
    OrderDao odd = new OrderDaoImpl();
    CartDao cd = new CartDaoImpl();
    ItemDao idd = new ItemDaoImpl();
    @Override
    public Orders insor(Integer id, int uid) {
        try {
            DBUtil.begin();
            Orders od = new Orders();
            //varchar类型没有自增，设置oid
            od.setOid(RandomUtils.createOrderId());
            od.setAid(id);
            od.setUid(uid);
            //时间直接设置当前时间
            od.setOtime(new Date());
            //设置常量存储状态
            od.setOstate(Const.orderCpde.NM);
            //设置总金额要获取购物车数据将所有小计相加
            List<Cart> cl = cd.getall(uid);
            //再创建item集合，来临时存储购物车的数据
            List<Item> ti = new ArrayList<>();
            double sun = 0;
            for (Cart cart : cl) {
                //遍历所有信息将信息中的金额添加其中
                sun += cart.getCcount();
                //创建item存储数据
                Item item = new Item();
                item.setOid(od.getOid());
                item.setPid(cart.getPid());
                item.setIcount(cart.getCcount());
                item.setInum(cart.getCnum());
                //添加到集合中
                ti.add(item);
            }
            boolean flag = false;
            if (sun!=0) {
                od.setOcount(sun);
                //添加订单需要删除购物车信息，所以要将购物车信息全部存储到item中。
                //添加到订单表中
                odd.addOrder(od);
                //购物车信息调价到item中
                idd.addItem(ti);
                //全部添加结束，清空购物车数据
                cd.daleCart(uid);
                flag = true;
            }
            DBUtil.commit();
            if (flag) {
                return od;
            }else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            DBUtil.rollback();
        }
        return null;
    }

    @Override
    public List<Orders> seleor(int uid) {
        try {
            DBUtil.begin();
            List<Orders> ol = odd.seleor(uid);
            DBUtil.commit();
            return ol;
        } catch (Exception e) {
            e.printStackTrace();
            DBUtil.rollback();
        }
        return null;
    }

    @Override
    public Orders getordDetail(String oid) {
        try {
            DBUtil.begin();
            //查询订单数据和address表中的地址信息
            Orders or = odd.seleoid(oid);
            //因为一对多所以要查询对应的所有的购物信息，暂存在item中的数据存储为集合，和购物信息对应的所买物品product的信息。
            List<Item> lt = idd.seleid(oid);
            //将购物信息存储到订单中，也就是将item集合赋值到orders中
            or.setListItem(lt);
            DBUtil.commit();
            return or;
        } catch (Exception e) {
            e.printStackTrace();
            DBUtil.rollback();
        }
        return null;
    }

    @Override
    public boolean updastate(String oid, int sp) {
        int a = odd.updastate(oid,sp);
        return false;
    }
}
